/*
TRABALHO 1 de COMPUTACAO 3 2007/2
Alunos:
 Anderson Marinho (DRE: 104042916)
 Artur Souza (DRE: 104020972)
*/


#include <iostream>
#include <stdlib.h>
#include "minha_matriz.h"
#include "minha_matriz_esparsa.h"
#include "minha_matriz_facade.h"

using namespace std;

class A {
public:
	A() {
		cout << "criou A"<< endl;
	}
	~A() {
		cout << "destruiu A"<< endl;
	}
};

int main(int argc, char * argv[]) {
	minha_matriz<A> mm(2);
	minha_matriz<int> matriz(3);
	matriz(0, 0) = 1;
	matriz(0, 1) = 1;
	matriz(0, 2) = 4;
	matriz(1, 0) = 1;
	matriz(1, 1) = 1;
	matriz(1, 2) = 6;
	matriz(2, 0) = 1;
	matriz(2, 1) = 1;
	matriz(2, 2) = 8;
	cout << matriz << endl;
	minha_matriz<int> r = matriz + matriz;
	cout << matriz << endl;
	cout << r << endl;
	matriz = matriz + matriz;
	matriz[2][2] = 0;
	matriz[0][0] = 1;
	matriz[1][0] = 2;
	matriz(2, 0) = 3;
	matriz(1)(0) = 4; // (col)(lin)
	cout << matriz << endl;

	int i=1;
	for (minha_matriz<int>::Iterator it = matriz.begin(); it != matriz.end(); ++it) {
		cout << i <<"o elem = "<< (*it)<< endl;
		i++;
	}

	for (minha_matriz<int>::IteradorLinha it = matriz.beginLinha(); it
			!= matriz.endLinha(); ++it) {
		cout << "1o elem da linha = "<< (*it)[0]<< endl;
	}

	for (minha_matriz<int>::IteradorColuna it = matriz.beginColuna(); it
			!= matriz.endColuna(); ++it) {
		cout << "1o elem da coluna = "<< (*it)(0)<< endl;
	}

	try {
		matriz[35][0] = 1;
	} catch (ExcecaoIndiceInvalidoDeMatriz e) {
		cout << "Indice invalido!" << endl;
	}

	try {
		matriz(2,35) = 1;
	} catch (ExcecaoIndiceInvalidoDeMatriz e) {
		cout << "Indice invalido!" << endl;
	}

	minha_matriz_esparsa<string,A> mme_A;
	minha_matriz_esparsa<string,int> mme;
	minha_matriz_esparsa<string,int> mme_2;
	minha_matriz_esparsa<int,int> mme_3(2, 2);
	minha_matriz_esparsa<int,int> mme_4(2, 1);
	cout << mme("a", "b") << endl; //deve ser 0
	mme("a", "b") = 1;
	cout << mme("a", "b") << endl; //deve ser 1
	cout << mme_2("a", "b") << endl; //deve ser 0
	mme_2 = mme;
	cout << mme_2("a", "b") << endl; // deve ser 1
	mme_2("a", "b") = 2;
	cout << mme("a", "b") << endl; //deve ser 1
	cout << mme_2("a", "b") << endl; //deve ser 2
	cout << mme_2 << endl;
	cout << "utilizacao: " << mme_3.utilizacao() << endl;
	mme_3(0, 0) = 1;
	cout << "utilizacao: " << mme_3.utilizacao() << endl;
	mme_3(0, 1) = 1;
	cout << "utilizacao: " << mme_3.utilizacao() << endl;
	mme_3(1, 0) = 1;
	cout << "utilizacao: " << mme_3.utilizacao() << endl;
	mme_3(1, 1) = 10;
	cout << "utilizacao: " << mme_3.utilizacao() << endl;
	cout << mme_3 << endl;
	mme_3 = mme_3 + mme_3;
	cout << mme_3 << endl;
	minha_matriz_esparsa_coluna<int,int> c = mme_3(1);
	cout << "imprimindo coluna" << endl;
	cout << c << endl;
	mme_4(0, 0) = 1;
	mme_4(1, 0) = 2;
	mme_3 = mme_3 * mme_4;
	cout << mme_3 << endl;
	cout << mme_4(0)[1]<< "="<< mme_4(0)(1) << endl;
	try {
		cout << mme_4(0,2) << endl;
	} catch (ExcecaoIndiceInvalidoDeMatriz e) {
		cout << "excecao indice esparsa" << endl;
	}
	try {
		cout << mme_4(1,1) << endl;
	} catch (ExcecaoIndiceInvalidoDeMatriz e) {
		cout << "excecao indice esparsa" << endl;
	}
	minha_matriz_facade<int> mmf(3);
	minha_matriz_facade<A> mmfa(2,2);
	mmfa(0,0) = A();
	mmfa(0,1) = A();
	mmfa(1,0) = A();
	mmf(0,1) = 1;
	cout << mmf << endl;
	minha_matriz_facade<int> mmf2 = mmf + mmf;
	cout << mmf2 << endl;
	mmf2 = matriz;
	cout << mmf2 << endl;
	mmf2 = mmf + matriz;
	cout << mmf2 << endl;
	mmf2 = matriz + mmf;
	cout << mmf2 << endl;
	mmf2 = matriz + matriz;
	cout << mmf2 << endl;
	mmf2 = mmf * matriz;
	cout << mmf2 << endl;
	mmf2 = matriz * mmf;
	cout << mmf2 << endl;
	mmf2 = matriz * matriz;
	mmf2(2)(2) = -1;
	mmf2(1)[2] = -1;
	mmf2[0][0] = -1;
	cout << mmf2 << endl;

	i=1;
	cout<<mme_3<<endl;
	for (minha_matriz_esparsa<int,int>::Iterator it = mme_3.begin(); it != mme_3.end(); ++it) {
		cout << i<< "o elem= "<< (*it)<< endl;
		i++;
	}

	for (minha_matriz_esparsa<int,int>::IteradorLinha it = mme_3.beginLinha(); it != mme_3.endLinha(); ++it) {
			cout <<"1o elem da linha= "<< (*it)[0]<< endl;
	}

	for (minha_matriz_esparsa<int,int>::IteradorColuna it = mme_3.beginColuna(); it != mme_3.endColuna(); ++it) {
			cout <<"1o elem da coluna= "<< (*it)[0]<< endl;
	}


	cout<<mmf2<<endl;
	i=1;
	for (minha_matriz_facade<int>::Iterator it = mmf2.begin(); it != mmf2.end(); ++it) {
		cout << i<< "o elem= "<< (*it)<< endl;
		i++;
	}

	for (minha_matriz_facade<int>::IteradorLinha it = mmf2.beginLinha(); it != mmf2.endLinha(); ++it) {
			cout <<"1o elem da linha= "<< (*it)[0]<< endl;
	}

	for (minha_matriz_facade<int>::IteradorColuna it = mmf2.beginColuna(); it != mmf2.endColuna(); ++it) {
			cout <<"1o elem da coluna= "<< (*it)[0]<< endl;
	}

	system("pause");
	return 0;
}
